/* * Copyright (C) 2012 Tirasa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.tirasa.hct.cocoon.sax; import static net.tirasa.hct.cocoon.sax.Constants.*; import java.io.IOException; import java.io.StringReader; import java.text.SimpleDateFormat; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import java.util.Map.Entry; import javax.jcr.Node; import javax.jcr.RepositoryException; import net.tirasa.hct.hstbeans.HCTTaxonomyCategoryBean; import net.tirasa.hct.hstbeans.HippoCompoundDocument; import net.tirasa.hct.hstbeans.HippoDate; import net.tirasa.hct.hstbeans.ImageLinkBean; import net.tirasa.hct.hstbeans.RelatedDocs; import net.tirasa.hct.repository.HCTConnManager; import net.tirasa.hct.repository.HCTQuery; import net.tirasa.hct.repository.HCTQueryResult; import net.tirasa.hct.util.ObjectUtils; import net.tirasa.hct.util.TaxonomyUtils; import org.apache.cocoon.sax.SAXConsumer; import org.apache.cocoon.sax.util.XMLUtils; import org.apache.commons.lang3.StringUtils; import org.hippoecm.hst.content.beans.ObjectBeanManagerException; import org.hippoecm.hst.content.beans.standard.HippoAsset; import org.hippoecm.hst.content.beans.standard.HippoDocument; import org.hippoecm.hst.content.beans.standard.HippoFacetSelect; import org.hippoecm.hst.content.beans.standard.HippoFolder; import org.hippoecm.hst.content.beans.standard.HippoGalleryImageSet; import org.hippoecm.hst.content.beans.standard.HippoHtml; import org.hippoecm.hst.content.beans.standard.HippoItem; import org.hippoecm.repository.api.HippoNodeType; import org.onehippo.forge.ecmtagging.Tag; import org.onehippo.forge.ecmtagging.TagCollection; import org.onehippo.forge.ecmtagging.TaggingNodeType; import org.onehippo.taxonomy.api.TaxonomyNodeTypes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; public class HippoItemXMLDumper { final private transient SAXConsumer saxConsumer; public HippoItemXMLDumper(final SAXConsumer saxConsumer) { this.saxConsumer = saxConsumer; } public void startQueryResult(final HCTQueryResult result, final HippoItem base) throws SAXException, RepositoryException { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.SIZE.getName(), Attribute.SIZE.getName(), XSD_LONG, String.valueOf(result.getUuids().size())); attrs.addAttribute(NS_EMPTY, Attribute.PAGE.getName(), Attribute.PAGE.getName(), XSD_LONG, String.valueOf(result.getPage())); attrs.addAttribute(NS_EMPTY, Attribute.TOTAL_PAGES.getName(), Attribute.TOTAL_PAGES.getName(), XSD_LONG, String.valueOf(result.getTotalPages())); saxConsumer.startElement(NS_HCT, Element.QUERY_RESULT.getName(), PREFIX_HCT + ":" + Element.QUERY_RESULT.getName(), attrs); saxConsumer.startElement(NS_HCT, Element.BASE.getName(), PREFIX_HCT + ":" + Element.BASE.getName(), EMPTY_ATTRS); if (base != null) { if (base instanceof HCTTaxonomyCategoryBean) { startTaxonomy((HCTTaxonomyCategoryBean) base, result.getLocale()); endTaxonomy(); } else { startHippoItem(base, base.getPath()); endHippoItem(base); } } saxConsumer.endElement(NS_HCT, Element.BASE.getName(), PREFIX_HCT + ":" + Element.BASE.getName()); } public void endQueryResult() throws SAXException { saxConsumer.endElement(NS_HCT, Element.QUERY_RESULT.getName(), PREFIX_HCT + ":" + Element.QUERY_RESULT.getName()); } public <T extends HippoItem> void startHippoItem(final T item, final String path) throws SAXException, RepositoryException { final Element elem = item instanceof HippoDocument ? Element.DOCUMENT : Element.FOLDER; final String localeString = item instanceof HippoDocument ? ((HippoDocument) item).getLocaleString() : item instanceof HippoFolder ? ((HippoFolder) item).getLocaleString() : ""; AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, item.getName()); attrs.addAttribute(NS_EMPTY, Attribute.TYPE.getName(), Attribute.TYPE.getName(), XSD_STRING, item.getNode().getPrimaryNodeType().getName()); attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, path); attrs.addAttribute(NS_EMPTY, Attribute.LOC_NAME.getName(), Attribute.LOC_NAME.getName(), XSD_STRING, item.getLocalizedName()); attrs.addAttribute(NS_EMPTY, Attribute.LOCALE.getName(), Attribute.LOCALE.getName(), XSD_STRING, localeString); // 0. the item saxConsumer.startElement(NS_HCT, elem.getName(), PREFIX_HCT + ":" + elem.getName(), attrs); // 1. translations saxConsumer.startElement(NS_HCT, Element.TRANSLATIONS.getName(), PREFIX_HCT + ":" + Element.TRANSLATIONS.getName(), EMPTY_ATTRS); for (String locale : item.getAvailableTranslations().getAvailableLocales()) { if (!localeString.equals(locale)) { attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.LOCALE.getName(), Attribute.LOCALE.getName(), XSD_STRING, locale); attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, item.getAvailableTranslations().getTranslation(locale).getCanonicalBean().getPath()); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, item.getAvailableTranslations().getTranslation(locale).getCanonicalBean().getName()); attrs.addAttribute(NS_EMPTY, Attribute.LOC_NAME.getName(), Attribute.LOC_NAME.getName(), XSD_STRING, item.getAvailableTranslations().getTranslation(locale).getCanonicalBean().getLocalizedName()); saxConsumer.startElement(NS_HCT, Element.TRANSLATION.getName(), PREFIX_HCT + ":" + Element.TRANSLATION.getName(), attrs); if (item instanceof HippoDocument) { attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, "hippo:availability"); saxConsumer.startElement(NS_HCT, Element.FIELD.getName(), PREFIX_HCT + ":" + Element.FIELD.getName(), attrs); for (String value : (String[]) item.getAvailableTranslations().getTranslation(locale). getProperty("hippo:availability")) { saxConsumer.startElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName(), EMPTY_ATTRS); saxConsumer.characters(value.toCharArray(), 0, value.length()); saxConsumer.endElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName()); } saxConsumer.endElement(NS_HCT, Element.FIELD.getName(), PREFIX_HCT + ":" + Element.FIELD.getName()); } saxConsumer.endElement(NS_HCT, Element.TRANSLATION.getName(), PREFIX_HCT + ":" + Element.TRANSLATION.getName()); } } saxConsumer.endElement(NS_HCT, Element.TRANSLATIONS.getName(), PREFIX_HCT + ":" + Element.TRANSLATIONS.getName()); } public void endHippoItem(final HippoItem item) throws SAXException { final Element elem = item instanceof HippoDocument ? Element.DOCUMENT : Element.FOLDER; saxConsumer.endElement(NS_HCT, elem.getName(), PREFIX_HCT + ":" + elem.getName()); } public void startHippoCompounds() throws SAXException, RepositoryException { saxConsumer.startElement(NS_HCT, Element.COMPOUNDS.getName(), PREFIX_HCT + ":" + Element.COMPOUNDS.getName(), EMPTY_ATTRS); } public void endHippoCompounds() throws SAXException { saxConsumer.endElement(NS_HCT, Element.COMPOUNDS.getName(), PREFIX_HCT + ":" + Element.COMPOUNDS.getName()); } public void startHippoCompound(final HippoDocument compound) throws SAXException, RepositoryException { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, compound.getName()); attrs.addAttribute(NS_EMPTY, Attribute.TYPE.getName(), Attribute.TYPE.getName(), XSD_STRING, compound.getNode().getPrimaryNodeType().getName()); attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, compound.getPath()); saxConsumer.startElement(NS_HCT, Element.COMPOUND.getName(), PREFIX_HCT + ":" + Element.COMPOUND.getName(), attrs); } public void endHippoCompound(final HippoDocument compound) throws SAXException { saxConsumer.endElement(NS_HCT, Element.COMPOUND.getName(), PREFIX_HCT + ":" + Element.COMPOUND.getName()); } public void dumpAssets(final List<HippoAsset> assets, final String elementName, final boolean wrap, final String dateFormat, final Locale locale) throws SAXException { if (wrap) { saxConsumer.startElement(NS_HCT, Element.ASSETS.getName(), PREFIX_HCT + ":" + Element.ASSETS.getName(), EMPTY_ATTRS); } final SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, locale); for (HippoAsset asset : assets) { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, asset.getName()); if (asset.getParentBean().getChildBeans("hippo:translation") != null && !asset.getParentBean().getChildBeans("hippo:translation").isEmpty()) { attrs.addAttribute(NS_EMPTY, Attribute.LOC_NAME.getName(), Attribute.LOC_NAME.getName(), XSD_STRING, ((HippoItem) asset.getParentBean().getChildBeans("hippo:translation").get(0)). getProperty("hippo:message", asset.getName()).toString()); } else { attrs.addAttribute(NS_EMPTY, Attribute.LOC_NAME.getName(), Attribute.LOC_NAME.getName(), XSD_STRING, asset.getName()); } attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, asset.getPath()); attrs.addAttribute(NS_EMPTY, Attribute.MIMETYPE.getName(), Attribute.MIMETYPE.getName(), XSD_STRING, asset.getAsset().getMimeType()); attrs.addAttribute(NS_EMPTY, Attribute.SIZE_KB.getName(), Attribute.SIZE_KB.getName(), XSD_INT, String.valueOf(asset.getAsset().getLengthKB())); attrs.addAttribute(NS_EMPTY, Attribute.LAST_MOD.getName(), Attribute.LAST_MOD.getName(), XSD_DATETIME, sdf.format(asset.getAsset(). getLastModified().getTime())); saxConsumer.startElement(NS_HCT, elementName, PREFIX_HCT + ":" + elementName, attrs); saxConsumer.endElement(NS_HCT, elementName, PREFIX_HCT + ":" + elementName); } if (wrap) { saxConsumer.endElement(NS_HCT, Element.ASSETS.getName(), PREFIX_HCT + ":" + Element.ASSETS.getName()); } } public void dumpImages(final List<HippoGalleryImageSet> images, final String elementName, final boolean wrap) throws SAXException, ObjectBeanManagerException { if (wrap) { saxConsumer.startElement(NS_HCT, Element.IMAGES.getName(), PREFIX_HCT + ":" + Element.IMAGES.getName(), EMPTY_ATTRS); } for (HippoGalleryImageSet img : images) { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, img.getPath()); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, img.getName()); if (StringUtils.isNotBlank(img.getDescription())) { attrs.addAttribute(NS_EMPTY, Attribute.DESC.getName(), Attribute.DESC.getName(), XSD_STRING, img.getDescription()); } attrs.addAttribute(NS_EMPTY, Attribute.HEIGHT.getName(), Attribute.HEIGHT.getName(), XSD_INT, String.valueOf(img.getOriginal().getHeight())); attrs.addAttribute(NS_EMPTY, Attribute.WIDTH.getName(), Attribute.WIDTH.getName(), XSD_INT, String.valueOf(img.getOriginal().getWidth())); saxConsumer.startElement(NS_HCT, elementName, PREFIX_HCT + ":" + elementName, attrs); saxConsumer.endElement(NS_HCT, elementName, PREFIX_HCT + ":" + elementName); } if (wrap) { saxConsumer.endElement(NS_HCT, Element.IMAGES.getName(), PREFIX_HCT + ":" + Element.IMAGES.getName()); } } public void dumpRelatedDocs(final List<HippoDocument> relDocs, final String elementName, final boolean wrap) throws SAXException, ObjectBeanManagerException { if (wrap) { saxConsumer.startElement(NS_HCT, Element.RELATED_DOCS.getName(), PREFIX_HCT + ":" + Element.RELATED_DOCS.getName(), EMPTY_ATTRS); } AttributesImpl attrs; for (HippoDocument relDoc : relDocs) { attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, relDoc.getName()); attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, relDoc.getPath()); attrs.addAttribute(NS_EMPTY, Attribute.LOC_NAME.getName(), Attribute.LOC_NAME.getName(), XSD_STRING, relDoc.getLocalizedName()); attrs.addAttribute(NS_EMPTY, Attribute.LOCALE.getName(), Attribute.LOCALE.getName(), XSD_STRING, relDoc.getLocalizedName()); saxConsumer.startElement(NS_HCT, elementName, PREFIX_HCT + ":" + elementName, attrs); saxConsumer.endElement(NS_HCT, elementName, PREFIX_HCT + ":" + elementName); } if (wrap) { saxConsumer.endElement(NS_HCT, Element.RELATED_DOCS.getName(), PREFIX_HCT + ":" + Element.RELATED_DOCS.getName()); } } public void dumpTags(final TagCollection tags) throws SAXException { saxConsumer.startElement(NS_HCT, Element.TAGS.getName(), PREFIX_HCT + ":" + Element.TAGS.getName(), EMPTY_ATTRS); for (Tag tag : tags.values()) { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.SCORE.getName(), Attribute.SCORE.getName(), XSD_DOUBLE, String.valueOf(tag.getScore())); saxConsumer.startElement(NS_HCT, Element.TAG.getName(), PREFIX_HCT + ":" + Element.TAG.getName(), attrs); saxConsumer.characters(tag.getName().toCharArray(), 0, tag.getName().length()); saxConsumer.endElement(NS_HCT, Element.TAG.getName(), PREFIX_HCT + ":" + Element.TAG.getName()); } saxConsumer.endElement(NS_HCT, Element.TAGS.getName(), PREFIX_HCT + ":" + Element.TAGS.getName()); } public void dumpTags(final String[] tags) throws SAXException { saxConsumer.startElement(NS_HCT, Element.TAGS.getName(), PREFIX_HCT + ":" + Element.TAGS.getName(), EMPTY_ATTRS); for (int i = 0; tags != null && i < tags.length; i++) { saxConsumer.startElement(NS_HCT, Element.TAG.getName(), PREFIX_HCT + ":" + Element.TAG.getName(), EMPTY_ATTRS); saxConsumer.characters(tags[i].toCharArray(), 0, tags[i].length()); saxConsumer.endElement(NS_HCT, Element.TAG.getName(), PREFIX_HCT + ":" + Element.TAG.getName()); } saxConsumer.endElement(NS_HCT, Element.TAGS.getName(), PREFIX_HCT + ":" + Element.TAGS.getName()); } public void startTaxonomy(final HCTTaxonomyCategoryBean taxonomy, final Locale locale) throws SAXException { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, taxonomy.getKey()); attrs.addAttribute(NS_EMPTY, Attribute.LOC_NAME.getName(), Attribute.LOC_NAME.getName(), XSD_STRING, taxonomy.getLocalizedName(locale.getLanguage())); attrs.addAttribute(NS_EMPTY, Attribute.ORDER.getName(), Attribute.ORDER.getName(), XSD_STRING, taxonomy.getOrder(locale.getLanguage())); attrs.addAttribute(NS_EMPTY, Attribute.PATH.getName(), Attribute.PATH.getName(), XSD_STRING, taxonomy.getPath()); saxConsumer.startElement(NS_HCT, Element.TAXONOMY.getName(), PREFIX_HCT + ":" + Element.TAXONOMY.getName(), attrs); } public void endTaxonomy() throws SAXException { saxConsumer.endElement(NS_HCT, Element.TAXONOMY.getName(), PREFIX_HCT + ":" + Element.TAXONOMY.getName()); } public void dumpTaxonomies(final List<HCTTaxonomyCategoryBean> taxonomies, final Locale locale) throws SAXException { saxConsumer.startElement(NS_HCT, Element.TAXONOMIES.getName(), PREFIX_HCT + ":" + Element.TAXONOMIES.getName(), EMPTY_ATTRS); for (HCTTaxonomyCategoryBean taxonomy : taxonomies) { startTaxonomy(taxonomy, locale); endTaxonomy(); } saxConsumer.endElement(NS_HCT, Element.TAXONOMIES.getName(), PREFIX_HCT + ":" + Element.TAXONOMIES.getName()); } public void dumpField(final Entry<String, Object> entry, final String dateFormat, final Locale locale) throws SAXException { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, entry.getKey()); saxConsumer.startElement(NS_HCT, Element.FIELD.getName(), PREFIX_HCT + ":" + Element.FIELD.getName(), attrs); if (entry.getValue() instanceof String) { saxConsumer.startElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName(), EMPTY_ATTRS); saxConsumer.characters(((String) entry.getValue()).toCharArray(), 0, ((String) entry.getValue()).length()); saxConsumer.endElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName()); } else if (entry.getValue() instanceof Boolean) { saxConsumer.startElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName(), EMPTY_ATTRS); saxConsumer.characters(((Boolean) entry.getValue()).toString().toCharArray(), 0, ((Boolean) entry.getValue()).toString().length()); saxConsumer.endElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName()); } else if (entry.getValue() instanceof GregorianCalendar) { final SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, locale); final String date = sdf.format(((GregorianCalendar) entry.getValue()).getTime()); saxConsumer.startElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName(), EMPTY_ATTRS); saxConsumer.characters(date.toCharArray(), 0, date.length()); saxConsumer.endElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName()); } else if (entry.getValue() instanceof String[]) { for (int i = 0; i < ((String[]) entry.getValue()).length; i++) { saxConsumer.startElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName(), EMPTY_ATTRS); saxConsumer.characters(((String[]) entry.getValue())[i].toCharArray(), 0, ((String[]) entry.getValue())[i].length()); saxConsumer.endElement(NS_HCT, Element.VALUE.getName(), PREFIX_HCT + ":" + Element.VALUE.getName()); } } saxConsumer.endElement(NS_HCT, Element.FIELD.getName(), PREFIX_HCT + ":" + Element.FIELD.getName()); } public void dumpDate(final String name, final Calendar calendar, final String dateFormat, final Locale locale) throws SAXException { dumpField(new SimpleEntry<String, Object>(name, calendar), dateFormat, locale); } public void dumpHtml(final HCTConnManager connManager, final HippoHtml rtf, final XMLReader xmlReader, final String dateFormat, final Locale locale) throws SAXException, IOException, ObjectBeanManagerException { final AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(NS_EMPTY, Attribute.NAME.getName(), Attribute.NAME.getName(), XSD_STRING, rtf.getName()); saxConsumer.startElement(NS_HCT, Element.FIELD.getName(), PREFIX_HCT + ":" + Element.FIELD.getName(), attrs); xmlReader.parse(new InputSource(new StringReader(rtf.getContent()))); final List<HippoGalleryImageSet> images = new ArrayList<HippoGalleryImageSet>(); final List<HippoAsset> assets = new ArrayList<HippoAsset>(); final List<HippoDocument> docs = new ArrayList<HippoDocument>(); for (HippoFacetSelect facetSelect : rtf.getChildBeans(HippoFacetSelect.class)) { final HippoItem subElement = ObjectUtils.getHippoItemByUuid(connManager, (String) facetSelect.getProperty(HippoNodeType.HIPPO_DOCBASE)); if (subElement instanceof HippoGalleryImageSet) { images.add((HippoGalleryImageSet) subElement); } if (subElement instanceof HippoAsset) { assets.add((HippoAsset) subElement); } else if (subElement instanceof HippoDocument) { docs.add((HippoDocument) subElement); } } saxConsumer.startElement(NS_HCT, Element.LINKS.getName(), PREFIX_HCT + ":" + Element.LINKS.getName(), EMPTY_ATTRS); dumpImages(images, Element.LINK.getName(), false); dumpAssets(assets, Element.LINK.getName(), false, dateFormat, locale); dumpRelatedDocs(docs, Element.LINK.getName(), false); saxConsumer.endElement(NS_HCT, Element.LINKS.getName(), PREFIX_HCT + ":" + Element.LINKS.getName()); saxConsumer.endElement(NS_HCT, Element.FIELD.getName(), PREFIX_HCT + ":" + Element.FIELD.getName()); } public void dumpHippoItem(final HCTConnManager connManager, final HippoItem item, final String itemPath, final HCTQuery hctQuery, final Locale locale) throws SAXException, RepositoryException, IOException, ObjectBeanManagerException { final XMLReader xmlReader = new StartEndDocumentFilter(XMLUtils.createXMLReader(saxConsumer)); xmlReader.setContentHandler(saxConsumer); startHippoItem(item, itemPath); for (final String fieldName : hctQuery.getReturnFields()) { Object fieldValue = null; if (fieldName.contains("/")) { final String[] splitted = fieldName.split("/"); final List<HippoCompoundDocument> compounds = item.getChildBeansByName(splitted[0], HippoCompoundDocument.class); if (!compounds.isEmpty()) { fieldValue = compounds.iterator().next().getProperty(splitted[1]); } } else { fieldValue = item.getProperty(fieldName); } if (fieldValue == null) { final List<HippoHtml> rtfs = item.getChildBeansByName(fieldName, HippoHtml.class); final List<HippoDate> dates = item.getChildBeansByName(fieldName, HippoDate.class); if (rtfs != null && !rtfs.isEmpty()) { for (HippoHtml rtf : rtfs) { dumpHtml(connManager, rtf, xmlReader, hctQuery.getDateFormat(), locale); } } if (dates != null && !dates.isEmpty()) { for (HippoDate date : dates) { dumpDate(fieldName, date.getCalendar(), hctQuery.getDateFormat(), locale); } } } else { dumpField(new SimpleEntry<String, Object>(fieldName, fieldValue), hctQuery.getDateFormat(), locale); } } if (hctQuery.isReturnTags()) { dumpTags((String[]) item.getProperty(TaggingNodeType.PROP_TAGS)); } if (hctQuery.isReturnTaxonomies()) { dumpTaxonomies(TaxonomyUtils.getTaxonomies(connManager, (String[]) item.getProperty(TaxonomyNodeTypes.HIPPOTAXONOMY_KEYS)), locale); } if (hctQuery.isReturnImages()) { final List<HippoGalleryImageSet> images = new ArrayList<HippoGalleryImageSet>(); for (ImageLinkBean imgLink : item.getChildBeans(ImageLinkBean.class)) { Node imgLinkNode = null; try { imgLinkNode = connManager.getSession().getNodeByIdentifier(imgLink.getImageSetUuid()); } catch (RepositoryException e) { // ignore } if (imgLinkNode != null) { final HippoItem imgLinkItem = ObjectUtils.getHippoItem(connManager, imgLinkNode); if (imgLinkItem instanceof HippoGalleryImageSet) { images.add((HippoGalleryImageSet) imgLinkItem); } } } dumpImages(images, Element.IMAGE.getName(), true); } if (hctQuery.isReturnRelatedDocs()) { final List<HippoDocument> relDocs = new ArrayList<HippoDocument>(); for (RelatedDocs docs : item.getChildBeans(RelatedDocs.class)) { for (String relDocUuid : docs.getRelatedDocsUuids()) { final HippoDocument doc = ObjectUtils.getHippoItemByUuid(connManager, relDocUuid, HippoDocument.class); if (doc != null) { relDocs.add(doc); } } } dumpRelatedDocs(relDocs, Element.DOCUMENT.getName(), true); } endHippoItem(item); } }